package com.sky.wsp.sql.scanner.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.compress.CompressUtil;
import cn.hutool.extra.compress.extractor.Extractor;

import java.io.File;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author wangshaopeng@talkweb.com.cn
 * @desccription 在此输入描述
 * @date 2024/11/12
 */
public class HutoolCompressUtil {

    /**
     * 递归搜索任意层级下的jar包，然后返回，进行人工判断是否解压
     */
    public static void deepJarList(File dir, List<String> deepJarList, Boolean useIgnoreFilter) {
        if (!dir.isDirectory()) {
            System.err.println("搜索地址必须为文件号！");
            return;
        }
        Set<String> ignoreNames = MyFileUtil.getLinesAsSet(ConfigFileConst.IGNORE_JAR_KEYS);
        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                deepJarList(file, deepJarList, useIgnoreFilter);
            }
            String fileName = file.getName();
            if (fileName.endsWith(".jar")) {
                String simpleName = FileNameUtil.simpleName(fileName);
                if(useIgnoreFilter){
                    boolean match = FileNameUtil.prefixMatch(simpleName, ignoreNames);
                    if (match) {
                        // 如果是三方依赖包，例如jakarta、spring、log4j等，则不解压
                        continue;
                    }
                }
                deepJarList.add(file.getAbsolutePath());
            }
        }
    }

    /**
     * 递归搜索任意层级下的jar包，并解压
     *
     * @param dir
     * @param delSrc 解压jar后是否删除源文件
     */
    public static boolean deepJarUnZipToDir(File dir, boolean delSrc, List<String> unZipDirs) {
        if (!dir.isDirectory()) {
            System.err.println("搜索地址必须为文件号！");
            return false;
        }
        Set<String> ignoreNames = MyFileUtil.getLinesAsSet(ConfigFileConst.IGNORE_JAR_KEYS);
        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                deepJarUnZipToDir(file, delSrc, unZipDirs);
                continue;
            }
            String fileName = file.getName();
            if (fileName.endsWith(".jar")) {
                String simpleName = FileNameUtil.simpleName(fileName);
                boolean match = FileNameUtil.prefixMatch(simpleName, ignoreNames);
                if (match) {
                    // 如果是三方依赖包，例如jakarta、spring、log4j等，则不解压
                    continue;
                }
                File newUnZipDir = new File(dir, simpleName);
                unZipToDir(file, newUnZipDir, delSrc);
                unZipDirs.add(newUnZipDir.getAbsolutePath());
            }
        }
        return true;
    }

    /**
     * 解压压缩包到指定目录，只支持jar/war/tar三种类型
     *
     * @param srcFile
     * @param unZipDir
     */
    public static String unZipToDir(File srcFile, File unZipDir, boolean delSrc) {
        if (srcFile.isDirectory()) {
            return "源文件只支持jar/war/tar三种类型！" + srcFile.getAbsolutePath();
        }
        if (!unZipDir.exists()) {
            unZipDir.mkdirs();
        }
        Extractor extractor = CompressUtil.createExtractor(
                CharsetUtil.defaultCharset(),
                FileUtil.file(srcFile));
        extractor.extract(unZipDir);
        if (delSrc) {
            FileUtil.del(srcFile);
        }
        System.out.println("已解压 " + unZipDir.getAbsolutePath());
        return unZipDir.getAbsolutePath();
    }
}
